package com.yangzc.lion.search.util;

import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.htmlparser.Parser;

/**
 * 创建索引
 */
public class IndexCreateUtil {

	public void createIndexForNews() throws Exception {
		// 存放索引的文件夹
		File indexFile = new File("e:/lucene/index2");
		// 使用了庖丁解牛分词器
		//Analyzer analyzer = new PaodingAnalyzer();
		//标准分词器
		Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);
		//索引的存储的位置
		Directory directory = FSDirectory.open(indexFile);
		//设置了存放索引的文件夹将以覆盖或者新建的方式建立
		IndexWriterConfig iwConfig = new IndexWriterConfig(Version.LUCENE_43, analyzer);
		iwConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
		// 使用索引文件夹，庖丁解牛分词器创建IndexWriter
		IndexWriter indexWriter = new IndexWriter(directory, iwConfig);
		// 从数据库中读取出所有的新闻记录以便进行索引的创建
		ResultSet rs = getNews();
		DateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
		// 对所有的新闻实体进行索引创建
		while(rs.next()){
			// 建立一个lucene文档
			Document doc = new Document();
			// 得到新闻标题
			String newsTitle = rs.getString("fd_name");
			// 得到新闻内容
			String newsContent = rs.getString("fd_login_name");
			// 得到新闻事件
			String publishDate = format.format(rs.getDate("fd_create_time"));
			// 得到新闻主键id
			String id = rs.getString("fd_Id") + "";
			// 将新闻标题加入文档，因为要搜索和高亮，所以index是tokennized，TermVector是WITH_POSITIONS_OFFSETS
			doc.add(new TextField("fd_name", newsTitle, Field.Store.YES));
			// 利用htmlparser得到新闻内容html的纯文本
			Parser parser = new Parser();
			parser.setInputHTML(newsContent);
			String strings = parser.parse(null).elementAt(0).toPlainTextString().trim();
			// 添加新闻内容至文档，与标题相似
			doc.add(new TextField("fd_login_name", strings, Field.Store.YES));
			// 添加时间至文档，因为要按照此字段降序排列排序，所以tokenzied,不用高亮所以TermVector是no就行了
			doc.add(new StringField("fd_create_time", publishDate, Field.Store.YES));
			// 添加主键至文档，不分词，不高亮。
			doc.add(new StringField("fd_id", id, Field.Store.YES));
			indexWriter.addDocument(doc);
		}
		System.out.println("索引创建完成！");
		// 创建索引
		indexWriter.commit();
		indexWriter.close();
		// 关闭
		rs.close();
	}
	
	/**
	 * 
	 * @return
	 * @throws Exception
	 */
	public ResultSet getNews() throws Exception{
		Connection conn = DBUtil.getMysqlConnection();
		String sql = "select t1.fd_name,t2.fd_login_name,t1.fd_Id,t1.fd_create_time from sys_org_element t1 left join sys_org_person t2 on t1.fd_id=t2.fd_id";
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		System.out.println("读取数据完成！");
		return rs;
	}
	
	public static void main(String[] args) throws Exception {
		IndexCreateUtil util = new IndexCreateUtil();
		util.createIndexForNews();
	}
}
